{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Use SARSA to Play MoutainCar-v0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import sys\n",
    "import logging\n",
    "import itertools\n",
    "\n",
    "import numpy as np\n",
    "np.random.seed(0)\n",
    "import gym\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "logging.basicConfig(level=logging.DEBUG,\n",
    "        format='%(asctime)s [%(levelname)s] %(message)s',\n",
    "        stream=sys.stdout, datefmt='%H:%M:%S')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15:06:49 [INFO] env: <MountainCarEnv<MountainCar-v0>>\n",
      "15:06:49 [INFO] action_space: Discrete(3)\n",
      "15:06:49 [INFO] observation_space: Box(-1.2000000476837158, 0.6000000238418579, (2,), float32)\n",
      "15:06:49 [INFO] reward_range: (-inf, inf)\n",
      "15:06:49 [INFO] metadata: {'render.modes': ['human', 'rgb_array'], 'video.frames_per_second': 30}\n",
      "15:06:49 [INFO] _max_episode_steps: 200\n",
      "15:06:49 [INFO] _elapsed_steps: None\n",
      "15:06:49 [INFO] id: MountainCar-v0\n",
      "15:06:49 [INFO] entry_point: gym.envs.classic_control:MountainCarEnv\n",
      "15:06:49 [INFO] reward_threshold: -110.0\n",
      "15:06:49 [INFO] nondeterministic: False\n",
      "15:06:49 [INFO] max_episode_steps: 200\n",
      "15:06:49 [INFO] _kwargs: {}\n",
      "15:06:49 [INFO] _env_name: MountainCar\n"
     ]
    }
   ],
   "source": [
    "env = gym.make('MountainCar-v0')\n",
    "env.seed(0)\n",
    "for key in vars(env):\n",
    "    logging.info('%s: %s', key, vars(env)[key])\n",
    "for key in vars(env.spec):\n",
    "    logging.info('%s: %s', key, vars(env.spec)[key])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class TileCoder:\n",
    "    def __init__(self, layer_count, feature_count):\n",
    "        self.layer_count = layer_count\n",
    "        self.feature_count = feature_count\n",
    "        self.codebook = {}\n",
    "\n",
    "    def get_feature(self, codeword):\n",
    "        if codeword in self.codebook:\n",
    "            return self.codebook[codeword]\n",
    "        count = len(self.codebook)\n",
    "        if count >= self.feature_count: # resolve conflicts\n",
    "            return hash(codeword) % self.feature_count\n",
    "        self.codebook[codeword] = count\n",
    "        return count\n",
    "\n",
    "    def __call__(self, floats=(), ints=()):\n",
    "        dim = len(floats)\n",
    "        scaled_floats = tuple(f * (self.layer_count ** 2) for f in floats)\n",
    "        features = []\n",
    "        for layer in range(self.layer_count):\n",
    "            codeword = (layer,) + tuple(\n",
    "                    int((f + (1 + dim * i) * layer) / self.layer_count)\n",
    "                    for i, f in enumerate(scaled_floats)) + ints\n",
    "            feature = self.get_feature(codeword)\n",
    "            features.append(feature)\n",
    "        return features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class SARSAAgent:\n",
    "    def __init__(self, env):\n",
    "        self.action_n = env.action_space.n\n",
    "        self.obs_low = env.observation_space.low\n",
    "        self.obs_scale = env.observation_space.high - \\\n",
    "                env.observation_space.low\n",
    "        self.encoder = TileCoder(8, 1896)\n",
    "        self.w = np.zeros(self.encoder.feature_count)\n",
    "        self.gamma = 1.\n",
    "        self.learning_rate = 0.03\n",
    "\n",
    "    def encode(self, observation, action):\n",
    "        states = tuple((observation - self.obs_low) / self.obs_scale)\n",
    "        actions = (action,)\n",
    "        return self.encoder(states, actions)\n",
    "\n",
    "    def get_q(self, observation, action): # action value\n",
    "        features = self.encode(observation, action)\n",
    "        return self.w[features].sum()\n",
    "\n",
    "    def reset(self, mode=None):\n",
    "        self.mode = mode\n",
    "        if self.mode == 'train':\n",
    "            self.trajectory = []\n",
    "\n",
    "    def step(self, observation, reward, done):\n",
    "        if self.mode == 'train' and np.random.rand() < 0.001:\n",
    "            action = np.random.randint(self.action_n)\n",
    "        else:\n",
    "            qs = [self.get_q(observation, action) for action in\n",
    "                    range(self.action_n)]\n",
    "            action = np.argmax(qs)\n",
    "        if self.mode == 'train':\n",
    "            self.trajectory += [observation, reward, done, action]\n",
    "            if len(self.trajectory) >= 8:\n",
    "                self.learn()\n",
    "        return action\n",
    "\n",
    "    def close(self):\n",
    "        pass\n",
    "\n",
    "    def learn(self):\n",
    "        observation, _, _, action, next_observation, reward, done, \\\n",
    "                next_action = self.trajectory[-8:]\n",
    "        target = reward + (1. - done) * self.gamma * \\\n",
    "                self.get_q(next_observation, next_action)\n",
    "        td_error = target - self.get_q(observation, action)\n",
    "        features = self.encode(observation, action)\n",
    "        self.w[features] += (self.learning_rate * td_error)\n",
    "\n",
    "\n",
    "agent = SARSAAgent(env)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15:06:49 [INFO] ==== train ====\n",
      "15:06:49 [DEBUG] train episode 0: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 1: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 2: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 3: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 4: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 5: reward = -200.00, steps = 200\n",
      "15:06:50 [DEBUG] train episode 6: reward = -200.00, steps = 200\n",
      "15:06:51 [DEBUG] train episode 7: reward = -200.00, steps = 200\n",
      "15:06:51 [DEBUG] train episode 8: reward = -200.00, steps = 200\n",
      "15:06:51 [DEBUG] train episode 9: reward = -200.00, steps = 200\n",
      "15:06:51 [DEBUG] train episode 10: reward = -200.00, steps = 200\n",
      "15:06:51 [DEBUG] train episode 11: reward = -200.00, steps = 200\n",
      "15:06:52 [DEBUG] train episode 12: reward = -200.00, steps = 200\n",
      "15:06:52 [DEBUG] train episode 13: reward = -200.00, steps = 200\n",
      "15:06:52 [DEBUG] train episode 14: reward = -200.00, steps = 200\n",
      "15:06:52 [DEBUG] train episode 15: reward = -200.00, steps = 200\n",
      "15:06:52 [DEBUG] train episode 16: reward = -200.00, steps = 200\n",
      "15:06:53 [DEBUG] train episode 17: reward = -200.00, steps = 200\n",
      "15:06:53 [DEBUG] train episode 18: reward = -200.00, steps = 200\n",
      "15:06:53 [DEBUG] train episode 19: reward = -200.00, steps = 200\n",
      "15:06:53 [DEBUG] train episode 20: reward = -200.00, steps = 200\n",
      "15:06:53 [DEBUG] train episode 21: reward = -200.00, steps = 200\n",
      "15:06:54 [DEBUG] train episode 22: reward = -200.00, steps = 200\n",
      "15:06:54 [DEBUG] train episode 23: reward = -200.00, steps = 200\n",
      "15:06:54 [DEBUG] train episode 24: reward = -200.00, steps = 200\n",
      "15:06:54 [DEBUG] train episode 25: reward = -200.00, steps = 200\n",
      "15:06:54 [DEBUG] train episode 26: reward = -200.00, steps = 200\n",
      "15:06:55 [DEBUG] train episode 27: reward = -200.00, steps = 200\n",
      "15:06:55 [DEBUG] train episode 28: reward = -200.00, steps = 200\n",
      "15:06:55 [DEBUG] train episode 29: reward = -195.00, steps = 195\n",
      "15:06:55 [DEBUG] train episode 30: reward = -200.00, steps = 200\n",
      "15:06:55 [DEBUG] train episode 31: reward = -200.00, steps = 200\n",
      "15:06:55 [DEBUG] train episode 32: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 33: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 34: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 35: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 36: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 37: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 38: reward = -200.00, steps = 200\n",
      "15:06:56 [DEBUG] train episode 39: reward = -200.00, steps = 200\n",
      "15:06:57 [DEBUG] train episode 40: reward = -200.00, steps = 200\n",
      "15:06:57 [DEBUG] train episode 41: reward = -200.00, steps = 200\n",
      "15:06:57 [DEBUG] train episode 42: reward = -200.00, steps = 200\n",
      "15:06:57 [DEBUG] train episode 43: reward = -199.00, steps = 199\n",
      "15:06:57 [DEBUG] train episode 44: reward = -200.00, steps = 200\n",
      "15:06:57 [DEBUG] train episode 45: reward = -200.00, steps = 200\n",
      "15:06:58 [DEBUG] train episode 46: reward = -172.00, steps = 172\n",
      "15:06:58 [DEBUG] train episode 47: reward = -200.00, steps = 200\n",
      "15:06:58 [DEBUG] train episode 48: reward = -161.00, steps = 161\n",
      "15:06:58 [DEBUG] train episode 49: reward = -200.00, steps = 200\n",
      "15:06:58 [DEBUG] train episode 50: reward = -200.00, steps = 200\n",
      "15:06:58 [DEBUG] train episode 51: reward = -200.00, steps = 200\n",
      "15:06:59 [DEBUG] train episode 52: reward = -200.00, steps = 200\n",
      "15:06:59 [DEBUG] train episode 53: reward = -200.00, steps = 200\n",
      "15:06:59 [DEBUG] train episode 54: reward = -200.00, steps = 200\n",
      "15:06:59 [DEBUG] train episode 55: reward = -200.00, steps = 200\n",
      "15:06:59 [DEBUG] train episode 56: reward = -170.00, steps = 170\n",
      "15:06:59 [DEBUG] train episode 57: reward = -162.00, steps = 162\n",
      "15:06:59 [DEBUG] train episode 58: reward = -166.00, steps = 166\n",
      "15:07:00 [DEBUG] train episode 59: reward = -200.00, steps = 200\n",
      "15:07:00 [DEBUG] train episode 60: reward = -200.00, steps = 200\n",
      "15:07:00 [DEBUG] train episode 61: reward = -200.00, steps = 200\n",
      "15:07:00 [DEBUG] train episode 62: reward = -200.00, steps = 200\n",
      "15:07:00 [DEBUG] train episode 63: reward = -161.00, steps = 161\n",
      "15:07:00 [DEBUG] train episode 64: reward = -200.00, steps = 200\n",
      "15:07:01 [DEBUG] train episode 65: reward = -200.00, steps = 200\n",
      "15:07:01 [DEBUG] train episode 66: reward = -161.00, steps = 161\n",
      "15:07:01 [DEBUG] train episode 67: reward = -200.00, steps = 200\n",
      "15:07:01 [DEBUG] train episode 68: reward = -170.00, steps = 170\n",
      "15:07:01 [DEBUG] train episode 69: reward = -200.00, steps = 200\n",
      "15:07:01 [DEBUG] train episode 70: reward = -199.00, steps = 199\n",
      "15:07:01 [DEBUG] train episode 71: reward = -161.00, steps = 161\n",
      "15:07:02 [DEBUG] train episode 72: reward = -200.00, steps = 200\n",
      "15:07:02 [DEBUG] train episode 73: reward = -197.00, steps = 197\n",
      "15:07:02 [DEBUG] train episode 74: reward = -200.00, steps = 200\n",
      "15:07:02 [DEBUG] train episode 75: reward = -200.00, steps = 200\n",
      "15:07:02 [DEBUG] train episode 76: reward = -200.00, steps = 200\n",
      "15:07:03 [DEBUG] train episode 77: reward = -165.00, steps = 165\n",
      "15:07:03 [DEBUG] train episode 78: reward = -200.00, steps = 200\n",
      "15:07:03 [DEBUG] train episode 79: reward = -158.00, steps = 158\n",
      "15:07:03 [DEBUG] train episode 80: reward = -200.00, steps = 200\n",
      "15:07:03 [DEBUG] train episode 81: reward = -200.00, steps = 200\n",
      "15:07:03 [DEBUG] train episode 82: reward = -200.00, steps = 200\n",
      "15:07:04 [DEBUG] train episode 83: reward = -168.00, steps = 168\n",
      "15:07:04 [DEBUG] train episode 84: reward = -200.00, steps = 200\n",
      "15:07:04 [DEBUG] train episode 85: reward = -200.00, steps = 200\n",
      "15:07:04 [DEBUG] train episode 86: reward = -200.00, steps = 200\n",
      "15:07:04 [DEBUG] train episode 87: reward = -171.00, steps = 171\n",
      "15:07:04 [DEBUG] train episode 88: reward = -162.00, steps = 162\n",
      "15:07:04 [DEBUG] train episode 89: reward = -200.00, steps = 200\n",
      "15:07:05 [DEBUG] train episode 90: reward = -200.00, steps = 200\n",
      "15:07:05 [DEBUG] train episode 91: reward = -200.00, steps = 200\n",
      "15:07:05 [DEBUG] train episode 92: reward = -192.00, steps = 192\n",
      "15:07:05 [DEBUG] train episode 93: reward = -200.00, steps = 200\n",
      "15:07:05 [DEBUG] train episode 94: reward = -200.00, steps = 200\n",
      "15:07:05 [DEBUG] train episode 95: reward = -154.00, steps = 154\n",
      "15:07:06 [DEBUG] train episode 96: reward = -200.00, steps = 200\n",
      "15:07:06 [DEBUG] train episode 97: reward = -152.00, steps = 152\n",
      "15:07:06 [DEBUG] train episode 98: reward = -199.00, steps = 199\n",
      "15:07:06 [DEBUG] train episode 99: reward = -200.00, steps = 200\n",
      "15:07:06 [DEBUG] train episode 100: reward = -200.00, steps = 200\n",
      "15:07:06 [DEBUG] train episode 101: reward = -197.00, steps = 197\n",
      "15:07:06 [DEBUG] train episode 102: reward = -163.00, steps = 163\n",
      "15:07:07 [DEBUG] train episode 103: reward = -161.00, steps = 161\n",
      "15:07:07 [DEBUG] train episode 104: reward = -200.00, steps = 200\n",
      "15:07:07 [DEBUG] train episode 105: reward = -187.00, steps = 187\n",
      "15:07:07 [DEBUG] train episode 106: reward = -166.00, steps = 166\n",
      "15:07:07 [DEBUG] train episode 107: reward = -200.00, steps = 200\n",
      "15:07:07 [DEBUG] train episode 108: reward = -198.00, steps = 198\n",
      "15:07:08 [DEBUG] train episode 109: reward = -164.00, steps = 164\n",
      "15:07:08 [DEBUG] train episode 110: reward = -193.00, steps = 193\n",
      "15:07:08 [DEBUG] train episode 111: reward = -160.00, steps = 160\n",
      "15:07:08 [DEBUG] train episode 112: reward = -156.00, steps = 156\n",
      "15:07:08 [DEBUG] train episode 113: reward = -152.00, steps = 152\n",
      "15:07:08 [DEBUG] train episode 114: reward = -200.00, steps = 200\n",
      "15:07:08 [DEBUG] train episode 115: reward = -155.00, steps = 155\n",
      "15:07:09 [DEBUG] train episode 116: reward = -187.00, steps = 187\n",
      "15:07:09 [DEBUG] train episode 117: reward = -152.00, steps = 152\n",
      "15:07:09 [DEBUG] train episode 118: reward = -156.00, steps = 156\n",
      "15:07:09 [DEBUG] train episode 119: reward = -154.00, steps = 154\n",
      "15:07:09 [DEBUG] train episode 120: reward = -154.00, steps = 154\n",
      "15:07:09 [DEBUG] train episode 121: reward = -165.00, steps = 165\n",
      "15:07:09 [DEBUG] train episode 122: reward = -155.00, steps = 155\n",
      "15:07:10 [DEBUG] train episode 123: reward = -200.00, steps = 200\n",
      "15:07:10 [DEBUG] train episode 124: reward = -158.00, steps = 158\n",
      "15:07:10 [DEBUG] train episode 125: reward = -160.00, steps = 160\n",
      "15:07:10 [DEBUG] train episode 126: reward = -190.00, steps = 190\n",
      "15:07:10 [DEBUG] train episode 127: reward = -156.00, steps = 156\n",
      "15:07:10 [DEBUG] train episode 128: reward = -124.00, steps = 124\n",
      "15:07:10 [DEBUG] train episode 129: reward = -115.00, steps = 115\n",
      "15:07:11 [DEBUG] train episode 130: reward = -196.00, steps = 196\n",
      "15:07:11 [DEBUG] train episode 131: reward = -126.00, steps = 126\n",
      "15:07:11 [DEBUG] train episode 132: reward = -156.00, steps = 156\n",
      "15:07:11 [DEBUG] train episode 133: reward = -118.00, steps = 118\n",
      "15:07:11 [DEBUG] train episode 134: reward = -200.00, steps = 200\n",
      "15:07:11 [DEBUG] train episode 135: reward = -155.00, steps = 155\n",
      "15:07:11 [DEBUG] train episode 136: reward = -200.00, steps = 200\n",
      "15:07:11 [DEBUG] train episode 137: reward = -117.00, steps = 117\n",
      "15:07:12 [DEBUG] train episode 138: reward = -198.00, steps = 198\n",
      "15:07:12 [DEBUG] train episode 139: reward = -179.00, steps = 179\n",
      "15:07:12 [DEBUG] train episode 140: reward = -156.00, steps = 156\n",
      "15:07:12 [DEBUG] train episode 141: reward = -200.00, steps = 200\n",
      "15:07:12 [DEBUG] train episode 142: reward = -153.00, steps = 153\n",
      "15:07:12 [DEBUG] train episode 143: reward = -131.00, steps = 131\n",
      "15:07:12 [DEBUG] train episode 144: reward = -123.00, steps = 123\n",
      "15:07:13 [DEBUG] train episode 145: reward = -119.00, steps = 119\n",
      "15:07:13 [DEBUG] train episode 146: reward = -127.00, steps = 127\n",
      "15:07:13 [DEBUG] train episode 147: reward = -154.00, steps = 154\n",
      "15:07:13 [DEBUG] train episode 148: reward = -149.00, steps = 149\n",
      "15:07:13 [DEBUG] train episode 149: reward = -153.00, steps = 153\n",
      "15:07:13 [DEBUG] train episode 150: reward = -149.00, steps = 149\n",
      "15:07:13 [DEBUG] train episode 151: reward = -200.00, steps = 200\n",
      "15:07:14 [DEBUG] train episode 152: reward = -143.00, steps = 143\n",
      "15:07:14 [DEBUG] train episode 153: reward = -117.00, steps = 117\n",
      "15:07:14 [DEBUG] train episode 154: reward = -160.00, steps = 160\n",
      "15:07:14 [DEBUG] train episode 155: reward = -193.00, steps = 193\n",
      "15:07:14 [DEBUG] train episode 156: reward = -156.00, steps = 156\n",
      "15:07:14 [DEBUG] train episode 157: reward = -149.00, steps = 149\n",
      "15:07:14 [DEBUG] train episode 158: reward = -151.00, steps = 151\n",
      "15:07:15 [DEBUG] train episode 159: reward = -116.00, steps = 116\n",
      "15:07:15 [DEBUG] train episode 160: reward = -123.00, steps = 123\n",
      "15:07:15 [DEBUG] train episode 161: reward = -156.00, steps = 156\n",
      "15:07:15 [DEBUG] train episode 162: reward = -177.00, steps = 177\n",
      "15:07:15 [DEBUG] train episode 163: reward = -147.00, steps = 147\n",
      "15:07:15 [DEBUG] train episode 164: reward = -118.00, steps = 118\n",
      "15:07:15 [DEBUG] train episode 165: reward = -148.00, steps = 148\n",
      "15:07:16 [DEBUG] train episode 166: reward = -120.00, steps = 120\n",
      "15:07:16 [DEBUG] train episode 167: reward = -153.00, steps = 153\n",
      "15:07:16 [DEBUG] train episode 168: reward = -151.00, steps = 151\n",
      "15:07:16 [DEBUG] train episode 169: reward = -118.00, steps = 118\n",
      "15:07:16 [DEBUG] train episode 170: reward = -116.00, steps = 116\n",
      "15:07:16 [DEBUG] train episode 171: reward = -123.00, steps = 123\n",
      "15:07:16 [DEBUG] train episode 172: reward = -163.00, steps = 163\n",
      "15:07:16 [DEBUG] train episode 173: reward = -146.00, steps = 146\n",
      "15:07:16 [DEBUG] train episode 174: reward = -151.00, steps = 151\n",
      "15:07:17 [DEBUG] train episode 175: reward = -175.00, steps = 175\n",
      "15:07:17 [DEBUG] train episode 176: reward = -111.00, steps = 111\n",
      "15:07:17 [DEBUG] train episode 177: reward = -160.00, steps = 160\n",
      "15:07:17 [DEBUG] train episode 178: reward = -112.00, steps = 112\n",
      "15:07:17 [DEBUG] train episode 179: reward = -122.00, steps = 122\n",
      "15:07:17 [DEBUG] train episode 180: reward = -159.00, steps = 159\n",
      "15:07:17 [DEBUG] train episode 181: reward = -149.00, steps = 149\n",
      "15:07:17 [DEBUG] train episode 182: reward = -144.00, steps = 144\n",
      "15:07:18 [DEBUG] train episode 183: reward = -141.00, steps = 141\n",
      "15:07:18 [DEBUG] train episode 184: reward = -115.00, steps = 115\n",
      "15:07:18 [DEBUG] train episode 185: reward = -155.00, steps = 155\n",
      "15:07:18 [DEBUG] train episode 186: reward = -144.00, steps = 144\n",
      "15:07:18 [DEBUG] train episode 187: reward = -125.00, steps = 125\n",
      "15:07:18 [DEBUG] train episode 188: reward = -156.00, steps = 156\n",
      "15:07:18 [DEBUG] train episode 189: reward = -155.00, steps = 155\n",
      "15:07:18 [DEBUG] train episode 190: reward = -148.00, steps = 148\n",
      "15:07:18 [DEBUG] train episode 191: reward = -115.00, steps = 115\n",
      "15:07:18 [DEBUG] train episode 192: reward = -152.00, steps = 152\n",
      "15:07:19 [DEBUG] train episode 193: reward = -114.00, steps = 114\n",
      "15:07:19 [DEBUG] train episode 194: reward = -112.00, steps = 112\n",
      "15:07:19 [DEBUG] train episode 195: reward = -113.00, steps = 113\n",
      "15:07:19 [DEBUG] train episode 196: reward = -121.00, steps = 121\n",
      "15:07:19 [DEBUG] train episode 197: reward = -120.00, steps = 120\n",
      "15:07:19 [DEBUG] train episode 198: reward = -90.00, steps = 90\n",
      "15:07:19 [DEBUG] train episode 199: reward = -150.00, steps = 150\n",
      "15:07:19 [DEBUG] train episode 200: reward = -113.00, steps = 113\n",
      "15:07:19 [DEBUG] train episode 201: reward = -156.00, steps = 156\n",
      "15:07:19 [DEBUG] train episode 202: reward = -146.00, steps = 146\n",
      "15:07:20 [DEBUG] train episode 203: reward = -152.00, steps = 152\n",
      "15:07:20 [DEBUG] train episode 204: reward = -116.00, steps = 116\n",
      "15:07:20 [DEBUG] train episode 205: reward = -145.00, steps = 145\n",
      "15:07:20 [DEBUG] train episode 206: reward = -151.00, steps = 151\n",
      "15:07:20 [DEBUG] train episode 207: reward = -151.00, steps = 151\n",
      "15:07:20 [DEBUG] train episode 208: reward = -123.00, steps = 123\n",
      "15:07:20 [DEBUG] train episode 209: reward = -145.00, steps = 145\n",
      "15:07:20 [DEBUG] train episode 210: reward = -141.00, steps = 141\n",
      "15:07:21 [DEBUG] train episode 211: reward = -161.00, steps = 161\n",
      "15:07:21 [DEBUG] train episode 212: reward = -113.00, steps = 113\n",
      "15:07:21 [DEBUG] train episode 213: reward = -168.00, steps = 168\n",
      "15:07:21 [DEBUG] train episode 214: reward = -155.00, steps = 155\n",
      "15:07:21 [DEBUG] train episode 215: reward = -154.00, steps = 154\n",
      "15:07:21 [DEBUG] train episode 216: reward = -149.00, steps = 149\n",
      "15:07:21 [DEBUG] train episode 217: reward = -153.00, steps = 153\n",
      "15:07:21 [DEBUG] train episode 218: reward = -168.00, steps = 168\n",
      "15:07:22 [DEBUG] train episode 219: reward = -149.00, steps = 149\n",
      "15:07:22 [DEBUG] train episode 220: reward = -151.00, steps = 151\n",
      "15:07:22 [DEBUG] train episode 221: reward = -146.00, steps = 146\n",
      "15:07:22 [DEBUG] train episode 222: reward = -151.00, steps = 151\n",
      "15:07:22 [DEBUG] train episode 223: reward = -151.00, steps = 151\n",
      "15:07:22 [DEBUG] train episode 224: reward = -154.00, steps = 154\n",
      "15:07:22 [DEBUG] train episode 225: reward = -151.00, steps = 151\n",
      "15:07:22 [DEBUG] train episode 226: reward = -112.00, steps = 112\n",
      "15:07:23 [DEBUG] train episode 227: reward = -166.00, steps = 166\n",
      "15:07:23 [DEBUG] train episode 228: reward = -147.00, steps = 147\n",
      "15:07:23 [DEBUG] train episode 229: reward = -114.00, steps = 114\n",
      "15:07:23 [DEBUG] train episode 230: reward = -121.00, steps = 121\n",
      "15:07:23 [DEBUG] train episode 231: reward = -110.00, steps = 110\n",
      "15:07:23 [DEBUG] train episode 232: reward = -153.00, steps = 153\n",
      "15:07:23 [DEBUG] train episode 233: reward = -125.00, steps = 125\n",
      "15:07:23 [DEBUG] train episode 234: reward = -155.00, steps = 155\n",
      "15:07:23 [DEBUG] train episode 235: reward = -149.00, steps = 149\n",
      "15:07:24 [DEBUG] train episode 236: reward = -145.00, steps = 145\n",
      "15:07:24 [DEBUG] train episode 237: reward = -147.00, steps = 147\n",
      "15:07:24 [DEBUG] train episode 238: reward = -151.00, steps = 151\n",
      "15:07:24 [DEBUG] train episode 239: reward = -148.00, steps = 148\n",
      "15:07:24 [DEBUG] train episode 240: reward = -173.00, steps = 173\n",
      "15:07:24 [DEBUG] train episode 241: reward = -138.00, steps = 138\n",
      "15:07:24 [DEBUG] train episode 242: reward = -120.00, steps = 120\n",
      "15:07:24 [DEBUG] train episode 243: reward = -158.00, steps = 158\n",
      "15:07:24 [DEBUG] train episode 244: reward = -144.00, steps = 144\n",
      "15:07:25 [DEBUG] train episode 245: reward = -150.00, steps = 150\n",
      "15:07:25 [DEBUG] train episode 246: reward = -153.00, steps = 153\n",
      "15:07:25 [DEBUG] train episode 247: reward = -143.00, steps = 143\n",
      "15:07:25 [DEBUG] train episode 248: reward = -144.00, steps = 144\n",
      "15:07:25 [DEBUG] train episode 249: reward = -148.00, steps = 148\n",
      "15:07:25 [DEBUG] train episode 250: reward = -132.00, steps = 132\n",
      "15:07:25 [DEBUG] train episode 251: reward = -151.00, steps = 151\n",
      "15:07:25 [DEBUG] train episode 252: reward = -150.00, steps = 150\n",
      "15:07:26 [DEBUG] train episode 253: reward = -148.00, steps = 148\n",
      "15:07:26 [DEBUG] train episode 254: reward = -144.00, steps = 144\n",
      "15:07:26 [DEBUG] train episode 255: reward = -146.00, steps = 146\n",
      "15:07:26 [DEBUG] train episode 256: reward = -143.00, steps = 143\n",
      "15:07:26 [DEBUG] train episode 257: reward = -148.00, steps = 148\n",
      "15:07:26 [DEBUG] train episode 258: reward = -136.00, steps = 136\n",
      "15:07:26 [DEBUG] train episode 259: reward = -111.00, steps = 111\n",
      "15:07:26 [DEBUG] train episode 260: reward = -152.00, steps = 152\n",
      "15:07:26 [DEBUG] train episode 261: reward = -116.00, steps = 116\n",
      "15:07:27 [DEBUG] train episode 262: reward = -164.00, steps = 164\n",
      "15:07:27 [DEBUG] train episode 263: reward = -149.00, steps = 149\n",
      "15:07:27 [DEBUG] train episode 264: reward = -142.00, steps = 142\n",
      "15:07:27 [DEBUG] train episode 265: reward = -145.00, steps = 145\n",
      "15:07:27 [DEBUG] train episode 266: reward = -153.00, steps = 153\n",
      "15:07:27 [DEBUG] train episode 267: reward = -165.00, steps = 165\n",
      "15:07:27 [DEBUG] train episode 268: reward = -101.00, steps = 101\n",
      "15:07:27 [DEBUG] train episode 269: reward = -146.00, steps = 146\n",
      "15:07:27 [DEBUG] train episode 270: reward = -92.00, steps = 92\n",
      "15:07:27 [DEBUG] train episode 271: reward = -114.00, steps = 114\n",
      "15:07:28 [DEBUG] train episode 272: reward = -144.00, steps = 144\n",
      "15:07:28 [DEBUG] train episode 273: reward = -113.00, steps = 113\n",
      "15:07:28 [DEBUG] train episode 274: reward = -89.00, steps = 89\n",
      "15:07:28 [DEBUG] train episode 275: reward = -170.00, steps = 170\n",
      "15:07:28 [DEBUG] train episode 276: reward = -109.00, steps = 109\n",
      "15:07:28 [DEBUG] train episode 277: reward = -92.00, steps = 92\n",
      "15:07:28 [DEBUG] train episode 278: reward = -87.00, steps = 87\n",
      "15:07:28 [DEBUG] train episode 279: reward = -160.00, steps = 160\n",
      "15:07:28 [DEBUG] train episode 280: reward = -107.00, steps = 107\n",
      "15:07:28 [DEBUG] train episode 281: reward = -161.00, steps = 161\n",
      "15:07:29 [DEBUG] train episode 282: reward = -131.00, steps = 131\n",
      "15:07:29 [DEBUG] train episode 283: reward = -142.00, steps = 142\n",
      "15:07:29 [DEBUG] train episode 284: reward = -159.00, steps = 159\n",
      "15:07:29 [DEBUG] train episode 285: reward = -114.00, steps = 114\n",
      "15:07:29 [DEBUG] train episode 286: reward = -111.00, steps = 111\n",
      "15:07:29 [DEBUG] train episode 287: reward = -155.00, steps = 155\n",
      "15:07:29 [DEBUG] train episode 288: reward = -146.00, steps = 146\n",
      "15:07:29 [DEBUG] train episode 289: reward = -129.00, steps = 129\n",
      "15:07:29 [DEBUG] train episode 290: reward = -154.00, steps = 154\n",
      "15:07:30 [DEBUG] train episode 291: reward = -155.00, steps = 155\n",
      "15:07:30 [DEBUG] train episode 292: reward = -147.00, steps = 147\n",
      "15:07:30 [DEBUG] train episode 293: reward = -146.00, steps = 146\n",
      "15:07:30 [DEBUG] train episode 294: reward = -154.00, steps = 154\n",
      "15:07:30 [DEBUG] train episode 295: reward = -123.00, steps = 123\n",
      "15:07:30 [DEBUG] train episode 296: reward = -149.00, steps = 149\n",
      "15:07:30 [DEBUG] train episode 297: reward = -159.00, steps = 159\n",
      "15:07:30 [DEBUG] train episode 298: reward = -159.00, steps = 159\n",
      "15:07:31 [DEBUG] train episode 299: reward = -158.00, steps = 158\n",
      "15:07:31 [DEBUG] train episode 300: reward = -164.00, steps = 164\n",
      "15:07:31 [DEBUG] train episode 301: reward = -155.00, steps = 155\n",
      "15:07:31 [DEBUG] train episode 302: reward = -129.00, steps = 129\n",
      "15:07:31 [DEBUG] train episode 303: reward = -157.00, steps = 157\n",
      "15:07:31 [DEBUG] train episode 304: reward = -160.00, steps = 160\n",
      "15:07:31 [DEBUG] train episode 305: reward = -93.00, steps = 93\n",
      "15:07:31 [DEBUG] train episode 306: reward = -145.00, steps = 145\n",
      "15:07:31 [DEBUG] train episode 307: reward = -108.00, steps = 108\n",
      "15:07:31 [DEBUG] train episode 308: reward = -151.00, steps = 151\n",
      "15:07:32 [DEBUG] train episode 309: reward = -88.00, steps = 88\n",
      "15:07:32 [DEBUG] train episode 310: reward = -109.00, steps = 109\n",
      "15:07:32 [DEBUG] train episode 311: reward = -93.00, steps = 93\n",
      "15:07:32 [DEBUG] train episode 312: reward = -169.00, steps = 169\n",
      "15:07:32 [DEBUG] train episode 313: reward = -91.00, steps = 91\n",
      "15:07:32 [DEBUG] train episode 314: reward = -156.00, steps = 156\n",
      "15:07:32 [DEBUG] train episode 315: reward = -123.00, steps = 123\n",
      "15:07:32 [DEBUG] train episode 316: reward = -138.00, steps = 138\n",
      "15:07:32 [DEBUG] train episode 317: reward = -138.00, steps = 138\n",
      "15:07:33 [DEBUG] train episode 318: reward = -142.00, steps = 142\n",
      "15:07:33 [DEBUG] train episode 319: reward = -116.00, steps = 116\n",
      "15:07:33 [DEBUG] train episode 320: reward = -119.00, steps = 119\n",
      "15:07:33 [DEBUG] train episode 321: reward = -114.00, steps = 114\n",
      "15:07:33 [DEBUG] train episode 322: reward = -115.00, steps = 115\n",
      "15:07:33 [DEBUG] train episode 323: reward = -150.00, steps = 150\n",
      "15:07:33 [DEBUG] train episode 324: reward = -119.00, steps = 119\n",
      "15:07:33 [DEBUG] train episode 325: reward = -148.00, steps = 148\n",
      "15:07:33 [DEBUG] train episode 326: reward = -148.00, steps = 148\n",
      "15:07:33 [DEBUG] train episode 327: reward = -149.00, steps = 149\n",
      "15:07:34 [DEBUG] train episode 328: reward = -149.00, steps = 149\n",
      "15:07:34 [DEBUG] train episode 329: reward = -149.00, steps = 149\n",
      "15:07:34 [DEBUG] train episode 330: reward = -146.00, steps = 146\n",
      "15:07:34 [DEBUG] train episode 331: reward = -147.00, steps = 147\n",
      "15:07:34 [DEBUG] train episode 332: reward = -143.00, steps = 143\n",
      "15:07:34 [DEBUG] train episode 333: reward = -156.00, steps = 156\n",
      "15:07:34 [DEBUG] train episode 334: reward = -114.00, steps = 114\n",
      "15:07:34 [DEBUG] train episode 335: reward = -148.00, steps = 148\n",
      "15:07:34 [DEBUG] train episode 336: reward = -113.00, steps = 113\n",
      "15:07:35 [DEBUG] train episode 337: reward = -157.00, steps = 157\n",
      "15:07:35 [DEBUG] train episode 338: reward = -148.00, steps = 148\n",
      "15:07:35 [DEBUG] train episode 339: reward = -156.00, steps = 156\n",
      "15:07:35 [DEBUG] train episode 340: reward = -156.00, steps = 156\n",
      "15:07:35 [DEBUG] train episode 341: reward = -152.00, steps = 152\n",
      "15:07:35 [DEBUG] train episode 342: reward = -138.00, steps = 138\n",
      "15:07:35 [DEBUG] train episode 343: reward = -148.00, steps = 148\n",
      "15:07:35 [DEBUG] train episode 344: reward = -154.00, steps = 154\n",
      "15:07:35 [DEBUG] train episode 345: reward = -116.00, steps = 116\n",
      "15:07:36 [DEBUG] train episode 346: reward = -114.00, steps = 114\n",
      "15:07:36 [DEBUG] train episode 347: reward = -177.00, steps = 177\n",
      "15:07:36 [DEBUG] train episode 348: reward = -97.00, steps = 97\n",
      "15:07:36 [DEBUG] train episode 349: reward = -145.00, steps = 145\n",
      "15:07:36 [DEBUG] train episode 350: reward = -115.00, steps = 115\n",
      "15:07:36 [DEBUG] train episode 351: reward = -138.00, steps = 138\n",
      "15:07:36 [DEBUG] train episode 352: reward = -146.00, steps = 146\n",
      "15:07:36 [DEBUG] train episode 353: reward = -144.00, steps = 144\n",
      "15:07:37 [DEBUG] train episode 354: reward = -156.00, steps = 156\n",
      "15:07:37 [DEBUG] train episode 355: reward = -135.00, steps = 135\n",
      "15:07:37 [DEBUG] train episode 356: reward = -138.00, steps = 138\n",
      "15:07:37 [DEBUG] train episode 357: reward = -139.00, steps = 139\n",
      "15:07:37 [DEBUG] train episode 358: reward = -150.00, steps = 150\n",
      "15:07:37 [DEBUG] train episode 359: reward = -146.00, steps = 146\n",
      "15:07:37 [DEBUG] train episode 360: reward = -156.00, steps = 156\n",
      "15:07:37 [DEBUG] train episode 361: reward = -155.00, steps = 155\n",
      "15:07:37 [DEBUG] train episode 362: reward = -127.00, steps = 127\n",
      "15:07:38 [DEBUG] train episode 363: reward = -147.00, steps = 147\n",
      "15:07:38 [DEBUG] train episode 364: reward = -148.00, steps = 148\n",
      "15:07:38 [DEBUG] train episode 365: reward = -145.00, steps = 145\n",
      "15:07:38 [DEBUG] train episode 366: reward = -142.00, steps = 142\n",
      "15:07:38 [DEBUG] train episode 367: reward = -154.00, steps = 154\n",
      "15:07:38 [DEBUG] train episode 368: reward = -151.00, steps = 151\n",
      "15:07:38 [DEBUG] train episode 369: reward = -145.00, steps = 145\n",
      "15:07:39 [DEBUG] train episode 370: reward = -150.00, steps = 150\n",
      "15:07:39 [DEBUG] train episode 371: reward = -145.00, steps = 145\n",
      "15:07:39 [DEBUG] train episode 372: reward = -141.00, steps = 141\n",
      "15:07:39 [DEBUG] train episode 373: reward = -146.00, steps = 146\n",
      "15:07:39 [DEBUG] train episode 374: reward = -148.00, steps = 148\n",
      "15:07:39 [DEBUG] train episode 375: reward = -121.00, steps = 121\n",
      "15:07:39 [DEBUG] train episode 376: reward = -157.00, steps = 157\n",
      "15:07:39 [DEBUG] train episode 377: reward = -154.00, steps = 154\n",
      "15:07:40 [DEBUG] train episode 378: reward = -157.00, steps = 157\n",
      "15:07:40 [DEBUG] train episode 379: reward = -148.00, steps = 148\n",
      "15:07:40 [DEBUG] train episode 380: reward = -131.00, steps = 131\n",
      "15:07:40 [DEBUG] train episode 381: reward = -123.00, steps = 123\n",
      "15:07:40 [DEBUG] train episode 382: reward = -168.00, steps = 168\n",
      "15:07:40 [DEBUG] train episode 383: reward = -155.00, steps = 155\n",
      "15:07:40 [DEBUG] train episode 384: reward = -154.00, steps = 154\n",
      "15:07:40 [DEBUG] train episode 385: reward = -97.00, steps = 97\n",
      "15:07:40 [DEBUG] train episode 386: reward = -112.00, steps = 112\n",
      "15:07:40 [DEBUG] train episode 387: reward = -84.00, steps = 84\n",
      "15:07:41 [DEBUG] train episode 388: reward = -159.00, steps = 159\n",
      "15:07:41 [DEBUG] train episode 389: reward = -155.00, steps = 155\n",
      "15:07:41 [DEBUG] train episode 390: reward = -163.00, steps = 163\n",
      "15:07:41 [DEBUG] train episode 391: reward = -147.00, steps = 147\n",
      "15:07:41 [DEBUG] train episode 392: reward = -162.00, steps = 162\n",
      "15:07:41 [DEBUG] train episode 393: reward = -125.00, steps = 125\n",
      "15:07:41 [DEBUG] train episode 394: reward = -98.00, steps = 98\n",
      "15:07:41 [DEBUG] train episode 395: reward = -99.00, steps = 99\n",
      "15:07:41 [DEBUG] train episode 396: reward = -161.00, steps = 161\n",
      "15:07:42 [DEBUG] train episode 397: reward = -117.00, steps = 117\n",
      "15:07:42 [DEBUG] train episode 398: reward = -157.00, steps = 157\n",
      "15:07:42 [DEBUG] train episode 399: reward = -114.00, steps = 114\n",
      "15:07:42 [DEBUG] train episode 400: reward = -99.00, steps = 99\n",
      "15:07:42 [DEBUG] train episode 401: reward = -149.00, steps = 149\n",
      "15:07:42 [DEBUG] train episode 402: reward = -102.00, steps = 102\n",
      "15:07:42 [DEBUG] train episode 403: reward = -105.00, steps = 105\n",
      "15:07:42 [DEBUG] train episode 404: reward = -102.00, steps = 102\n",
      "15:07:42 [DEBUG] train episode 405: reward = -108.00, steps = 108\n",
      "15:07:42 [DEBUG] train episode 406: reward = -145.00, steps = 145\n",
      "15:07:43 [DEBUG] train episode 407: reward = -108.00, steps = 108\n",
      "15:07:43 [DEBUG] train episode 408: reward = -108.00, steps = 108\n",
      "15:07:43 [DEBUG] train episode 409: reward = -97.00, steps = 97\n",
      "15:07:43 [DEBUG] train episode 410: reward = -162.00, steps = 162\n",
      "15:07:43 [DEBUG] train episode 411: reward = -141.00, steps = 141\n",
      "15:07:43 [DEBUG] train episode 412: reward = -141.00, steps = 141\n",
      "15:07:43 [DEBUG] train episode 413: reward = -107.00, steps = 107\n",
      "15:07:43 [DEBUG] train episode 414: reward = -153.00, steps = 153\n",
      "15:07:44 [DEBUG] train episode 415: reward = -153.00, steps = 153\n",
      "15:07:44 [DEBUG] train episode 416: reward = -139.00, steps = 139\n",
      "15:07:44 [DEBUG] train episode 417: reward = -143.00, steps = 143\n",
      "15:07:44 [DEBUG] train episode 418: reward = -164.00, steps = 164\n",
      "15:07:44 [DEBUG] train episode 419: reward = -150.00, steps = 150\n",
      "15:07:44 [DEBUG] train episode 420: reward = -143.00, steps = 143\n",
      "15:07:44 [DEBUG] train episode 421: reward = -108.00, steps = 108\n",
      "15:07:44 [DEBUG] train episode 422: reward = -148.00, steps = 148\n",
      "15:07:44 [DEBUG] train episode 423: reward = -156.00, steps = 156\n",
      "15:07:44 [DEBUG] train episode 424: reward = -106.00, steps = 106\n",
      "15:07:45 [DEBUG] train episode 425: reward = -106.00, steps = 106\n",
      "15:07:45 [DEBUG] train episode 426: reward = -107.00, steps = 107\n",
      "15:07:45 [DEBUG] train episode 427: reward = -87.00, steps = 87\n",
      "15:07:45 [DEBUG] train episode 428: reward = -87.00, steps = 87\n",
      "15:07:45 [DEBUG] train episode 429: reward = -189.00, steps = 189\n",
      "15:07:45 [DEBUG] train episode 430: reward = -155.00, steps = 155\n",
      "15:07:45 [DEBUG] train episode 431: reward = -107.00, steps = 107\n",
      "15:07:45 [DEBUG] train episode 432: reward = -150.00, steps = 150\n",
      "15:07:45 [DEBUG] train episode 433: reward = -89.00, steps = 89\n",
      "15:07:46 [DEBUG] train episode 434: reward = -141.00, steps = 141\n",
      "15:07:46 [DEBUG] train episode 435: reward = -139.00, steps = 139\n",
      "15:07:46 [DEBUG] train episode 436: reward = -87.00, steps = 87\n",
      "15:07:46 [DEBUG] train episode 437: reward = -151.00, steps = 151\n",
      "15:07:46 [DEBUG] train episode 438: reward = -96.00, steps = 96\n",
      "15:07:46 [DEBUG] train episode 439: reward = -108.00, steps = 108\n",
      "15:07:46 [DEBUG] train episode 440: reward = -136.00, steps = 136\n",
      "15:07:46 [DEBUG] train episode 441: reward = -108.00, steps = 108\n",
      "15:07:46 [DEBUG] train episode 442: reward = -101.00, steps = 101\n",
      "15:07:46 [DEBUG] train episode 443: reward = -107.00, steps = 107\n",
      "15:07:47 [DEBUG] train episode 444: reward = -106.00, steps = 106\n",
      "15:07:47 [DEBUG] train episode 445: reward = -91.00, steps = 91\n",
      "15:07:47 [INFO] ==== test ====\n",
      "15:07:47 [DEBUG] test episode 0: reward = -106.00, steps = 106\n",
      "15:07:47 [DEBUG] test episode 1: reward = -161.00, steps = 161\n",
      "15:07:47 [DEBUG] test episode 2: reward = -86.00, steps = 86\n",
      "15:07:47 [DEBUG] test episode 3: reward = -161.00, steps = 161\n",
      "15:07:47 [DEBUG] test episode 4: reward = -200.00, steps = 200\n",
      "15:07:47 [DEBUG] test episode 5: reward = -104.00, steps = 104\n",
      "15:07:47 [DEBUG] test episode 6: reward = -83.00, steps = 83\n",
      "15:07:47 [DEBUG] test episode 7: reward = -103.00, steps = 103\n",
      "15:07:47 [DEBUG] test episode 8: reward = -91.00, steps = 91\n",
      "15:07:47 [DEBUG] test episode 9: reward = -104.00, steps = 104\n",
      "15:07:47 [DEBUG] test episode 10: reward = -84.00, steps = 84\n",
      "15:07:47 [DEBUG] test episode 11: reward = -200.00, steps = 200\n",
      "15:07:47 [DEBUG] test episode 12: reward = -173.00, steps = 173\n",
      "15:07:48 [DEBUG] test episode 13: reward = -106.00, steps = 106\n",
      "15:07:48 [DEBUG] test episode 14: reward = -90.00, steps = 90\n",
      "15:07:48 [DEBUG] test episode 15: reward = -85.00, steps = 85\n",
      "15:07:48 [DEBUG] test episode 16: reward = -88.00, steps = 88\n",
      "15:07:48 [DEBUG] test episode 17: reward = -103.00, steps = 103\n",
      "15:07:48 [DEBUG] test episode 18: reward = -103.00, steps = 103\n",
      "15:07:48 [DEBUG] test episode 19: reward = -200.00, steps = 200\n",
      "15:07:48 [DEBUG] test episode 20: reward = -200.00, steps = 200\n",
      "15:07:48 [DEBUG] test episode 21: reward = -178.00, steps = 178\n",
      "15:07:48 [DEBUG] test episode 22: reward = -104.00, steps = 104\n",
      "15:07:48 [DEBUG] test episode 23: reward = -88.00, steps = 88\n",
      "15:07:48 [DEBUG] test episode 24: reward = -107.00, steps = 107\n",
      "15:07:48 [DEBUG] test episode 25: reward = -86.00, steps = 86\n",
      "15:07:48 [DEBUG] test episode 26: reward = -147.00, steps = 147\n",
      "15:07:48 [DEBUG] test episode 27: reward = -92.00, steps = 92\n",
      "15:07:48 [DEBUG] test episode 28: reward = -170.00, steps = 170\n",
      "15:07:48 [DEBUG] test episode 29: reward = -96.00, steps = 96\n",
      "15:07:48 [DEBUG] test episode 30: reward = -104.00, steps = 104\n",
      "15:07:48 [DEBUG] test episode 31: reward = -170.00, steps = 170\n",
      "15:07:48 [DEBUG] test episode 32: reward = -90.00, steps = 90\n",
      "15:07:48 [DEBUG] test episode 33: reward = -84.00, steps = 84\n",
      "15:07:48 [DEBUG] test episode 34: reward = -134.00, steps = 134\n",
      "15:07:49 [DEBUG] test episode 35: reward = -104.00, steps = 104\n",
      "15:07:49 [DEBUG] test episode 36: reward = -107.00, steps = 107\n",
      "15:07:49 [DEBUG] test episode 37: reward = -85.00, steps = 85\n",
      "15:07:49 [DEBUG] test episode 38: reward = -175.00, steps = 175\n",
      "15:07:49 [DEBUG] test episode 39: reward = -188.00, steps = 188\n",
      "15:07:49 [DEBUG] test episode 40: reward = -104.00, steps = 104\n",
      "15:07:49 [DEBUG] test episode 41: reward = -90.00, steps = 90\n",
      "15:07:49 [DEBUG] test episode 42: reward = -83.00, steps = 83\n",
      "15:07:49 [DEBUG] test episode 43: reward = -200.00, steps = 200\n",
      "15:07:49 [DEBUG] test episode 44: reward = -200.00, steps = 200\n",
      "15:07:49 [DEBUG] test episode 45: reward = -83.00, steps = 83\n",
      "15:07:49 [DEBUG] test episode 46: reward = -84.00, steps = 84\n",
      "15:07:49 [DEBUG] test episode 47: reward = -103.00, steps = 103\n",
      "15:07:49 [DEBUG] test episode 48: reward = -84.00, steps = 84\n",
      "15:07:49 [DEBUG] test episode 49: reward = -86.00, steps = 86\n",
      "15:07:49 [DEBUG] test episode 50: reward = -107.00, steps = 107\n",
      "15:07:49 [DEBUG] test episode 51: reward = -91.00, steps = 91\n",
      "15:07:49 [DEBUG] test episode 52: reward = -183.00, steps = 183\n",
      "15:07:49 [DEBUG] test episode 53: reward = -103.00, steps = 103\n",
      "15:07:49 [DEBUG] test episode 54: reward = -103.00, steps = 103\n",
      "15:07:50 [DEBUG] test episode 55: reward = -174.00, steps = 174\n",
      "15:07:50 [DEBUG] test episode 56: reward = -87.00, steps = 87\n",
      "15:07:50 [DEBUG] test episode 57: reward = -161.00, steps = 161\n",
      "15:07:50 [DEBUG] test episode 58: reward = -200.00, steps = 200\n",
      "15:07:50 [DEBUG] test episode 59: reward = -104.00, steps = 104\n",
      "15:07:50 [DEBUG] test episode 60: reward = -85.00, steps = 85\n",
      "15:07:50 [DEBUG] test episode 61: reward = -104.00, steps = 104\n",
      "15:07:50 [DEBUG] test episode 62: reward = -190.00, steps = 190\n",
      "15:07:50 [DEBUG] test episode 63: reward = -184.00, steps = 184\n",
      "15:07:50 [DEBUG] test episode 64: reward = -104.00, steps = 104\n",
      "15:07:50 [DEBUG] test episode 65: reward = -106.00, steps = 106\n",
      "15:07:50 [DEBUG] test episode 66: reward = -104.00, steps = 104\n",
      "15:07:50 [DEBUG] test episode 67: reward = -103.00, steps = 103\n",
      "15:07:50 [DEBUG] test episode 68: reward = -153.00, steps = 153\n",
      "15:07:50 [DEBUG] test episode 69: reward = -171.00, steps = 171\n",
      "15:07:51 [DEBUG] test episode 70: reward = -155.00, steps = 155\n",
      "15:07:51 [DEBUG] test episode 71: reward = -107.00, steps = 107\n",
      "15:07:51 [DEBUG] test episode 72: reward = -87.00, steps = 87\n",
      "15:07:51 [DEBUG] test episode 73: reward = -178.00, steps = 178\n",
      "15:07:51 [DEBUG] test episode 74: reward = -103.00, steps = 103\n",
      "15:07:51 [DEBUG] test episode 75: reward = -107.00, steps = 107\n",
      "15:07:51 [DEBUG] test episode 76: reward = -84.00, steps = 84\n",
      "15:07:51 [DEBUG] test episode 77: reward = -110.00, steps = 110\n",
      "15:07:51 [DEBUG] test episode 78: reward = -181.00, steps = 181\n",
      "15:07:51 [DEBUG] test episode 79: reward = -200.00, steps = 200\n",
      "15:07:51 [DEBUG] test episode 80: reward = -157.00, steps = 157\n",
      "15:07:51 [DEBUG] test episode 81: reward = -103.00, steps = 103\n",
      "15:07:51 [DEBUG] test episode 82: reward = -93.00, steps = 93\n",
      "15:07:51 [DEBUG] test episode 83: reward = -103.00, steps = 103\n",
      "15:07:51 [DEBUG] test episode 84: reward = -104.00, steps = 104\n",
      "15:07:51 [DEBUG] test episode 85: reward = -103.00, steps = 103\n",
      "15:07:51 [DEBUG] test episode 86: reward = -86.00, steps = 86\n",
      "15:07:52 [DEBUG] test episode 87: reward = -179.00, steps = 179\n",
      "15:07:52 [DEBUG] test episode 88: reward = -103.00, steps = 103\n",
      "15:07:52 [DEBUG] test episode 89: reward = -103.00, steps = 103\n",
      "15:07:52 [DEBUG] test episode 90: reward = -188.00, steps = 188\n",
      "15:07:52 [DEBUG] test episode 91: reward = -153.00, steps = 153\n",
      "15:07:52 [DEBUG] test episode 92: reward = -103.00, steps = 103\n",
      "15:07:52 [DEBUG] test episode 93: reward = -86.00, steps = 86\n",
      "15:07:52 [DEBUG] test episode 94: reward = -108.00, steps = 108\n",
      "15:07:52 [DEBUG] test episode 95: reward = -103.00, steps = 103\n",
      "15:07:52 [DEBUG] test episode 96: reward = -200.00, steps = 200\n",
      "15:07:52 [DEBUG] test episode 97: reward = -107.00, steps = 107\n",
      "15:07:52 [DEBUG] test episode 98: reward = -103.00, steps = 103\n",
      "15:07:52 [DEBUG] test episode 99: reward = -86.00, steps = 86\n",
      "15:07:52 [INFO] average episode reward = -123.57 ± 40.09\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def play_episode(env, agent, max_episode_steps=None, mode=None, render=False):\n",
    "    observation, reward, done = env.reset(), 0., False\n",
    "    agent.reset(mode=mode)\n",
    "    episode_reward, elapsed_steps = 0., 0\n",
    "    while True:\n",
    "        action = agent.step(observation, reward, done)\n",
    "        if render:\n",
    "            env.render()\n",
    "        if done:\n",
    "            break\n",
    "        observation, reward, done, _ = env.step(action)\n",
    "        episode_reward += reward\n",
    "        elapsed_steps += 1\n",
    "        if max_episode_steps and elapsed_steps >= max_episode_steps:\n",
    "            break\n",
    "    agent.close()\n",
    "    return episode_reward, elapsed_steps\n",
    "\n",
    "\n",
    "logging.info('==== train ====')\n",
    "episode_rewards = []\n",
    "for episode in itertools.count():\n",
    "    episode_reward, elapsed_steps = play_episode(env.unwrapped, agent,\n",
    "            max_episode_steps=env._max_episode_steps, mode='train')\n",
    "    episode_rewards.append(episode_reward)\n",
    "    logging.debug('train episode %d: reward = %.2f, steps = %d',\n",
    "            episode, episode_reward, elapsed_steps)\n",
    "    if np.mean(episode_rewards[-10:]) > -110:\n",
    "        break\n",
    "plt.plot(episode_rewards)\n",
    "\n",
    "\n",
    "logging.info('==== test ====')\n",
    "episode_rewards = []\n",
    "for episode in range(100):\n",
    "    episode_reward, elapsed_steps = play_episode(env, agent)\n",
    "    episode_rewards.append(episode_reward)\n",
    "    logging.debug('test episode %d: reward = %.2f, steps = %d',\n",
    "            episode, episode_reward, elapsed_steps)\n",
    "logging.info('average episode reward = %.2f ± %.2f',\n",
    "        np.mean(episode_rewards), np.std(episode_rewards))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
